using JT808Protocol.Common;
using System;
using System.Text.Json.Serialization;

namespace JT808Protocol.Models.BodyParserStrategy.Location.LocationAddition
{
    /// <summary>
    /// 高级驾驶辅助(ADAS)报警信息数据格式
    /// </summary>
    public class LaAdasAlarm_0x64 : ILocationAddition
    {
        /// <summary>
        /// 报警 ID
        /// 按照报警先后，从0开始循环累加，不区分报警类型
        /// </summary>
        [JsonPropertyName("报警 ID")] public uint AlarmID { get; set; }

        /// <summary>
        /// 报警标志
        /// 0x00：不可用
        /// 0x01：开始标志
        /// 0x02：结束标志
        /// 该字段仅适用于有开始和结束标志类型的报警或事件，报警类型或事件类型无开始和结束标志，则该位不可用，填入0x00即可
        /// </summary>
        [JsonPropertyName("报警标志")] public byte AlarmStatus { get; set; }

        /// <summary>
        /// 报警事件类型
        /// 0x01：前向碰撞报警
        /// 0x02：车道偏离报警
        /// 0x03：车距过近报警
        /// 0x04：行人碰撞报警
        /// 0x05：频繁变道报警
        /// 0x06：道路标识超限报警
        /// 0x07：障碍物报警
        /// 0x08~0x0F：用户自定义
        /// 0x10：道路标志识别事件
        /// 0x11：主动抓拍事件
        /// 0x12~0x1F：用户自定义
        /// </summary>
        [JsonPropertyName("报警事件类型")] public byte AlarmEvent { get; set; }

        /// <summary>
        /// 报警级别
        /// 0x01：一级报警
        /// 0x02：二级报警
        /// </summary>
        [JsonPropertyName("报警级别")] public byte AlarmLevel { get; set; }

        /// <summary>
        /// 前车车速
        /// 单位Km/h。有效范围0~250，仅报警类型为0x01和0x02时有效
        /// </summary>
        [JsonPropertyName("前车车速")] public byte FrontVehicleSpeed { get; set; }

        /// <summary>
        /// 前车距离
        /// 单位100ms，范围0~100，仅报警类型为0x01、0x02和0x04时有效
        /// </summary>
        [JsonPropertyName("前车距离")] public byte FrontVehicleDistance { get; set; }

        /// <summary>
        /// 偏离类型
        /// 0x01：左侧偏离
        /// 0x02：右侧偏离
        /// 仅报警类型为0x02时有效
        /// </summary>
        [JsonPropertyName("偏离类型")] public byte DepartureType { get; set; }

        /// <summary>
        /// 道路标志类型
        /// 0x01：限速标志
        /// 0x02：限高标志
        /// 0x03：限重标志
        /// 仅报警类型为0x06和0x10时有效
        /// </summary>
        [JsonPropertyName("道路标志类型")] public byte RoadLogoType { get; set; }

        /// <summary>
        /// 道路标志识别数据
        /// 识别到道路标志的数据
        /// </summary>
        [JsonPropertyName("道路标志识别数据")] public byte RoadLogo { get; set; }

        /// <summary>
        /// 车速
        /// 单位Km/h。范围0~250
        /// </summary>
        [JsonPropertyName("车速")] public byte Speed { get; set; }

        /// <summary>
        /// 高程
        /// </summary>
        [JsonPropertyName("高程")] public ushort Elevation { get; set; }

        /// <summary>
        /// 纬度
        /// 以度为单位的纬度值乘以10 的6次方，精确到百万分之一度
        /// </summary>
        [JsonPropertyName("纬度")] public decimal Latitude { get; set; }

        /// <summary>
        /// 经度
        /// 以度为单位的纬度值乘以10 的6次方，精确到百万分之一度
        /// </summary>
        [JsonPropertyName("经度")] public decimal Longitude { get; set; }

        /// <summary>
        /// 日期时间
        /// YY-MM-DD-hh-mm-ss （GMT+8时间）
        /// </summary>
        [JsonPropertyName("日期时间")] public DateTime Time { get; set; }

        /// <summary>
        /// 车辆状态
        /// 按位表示车辆其他状态：
        /// Bit0 ACC状态， 0：关闭，1：打开
        /// Bit1 左转向状态，0：关闭，1：打开
        /// Bit2 右转向状态， 0：关闭，1：打开
        /// Bit3 雨刮器状态， 0：关闭，1：打开
        /// Bit4 制动状态，0：未制动，1：制动
        /// Bit5 插卡状态，0：未插卡，1：已插卡
        /// Bit6~Bit9 自定义
        /// Bit10 定位状态，0：未定位，1：已定位
        /// Bit11~bit15 自定义
        /// </summary>
        [JsonPropertyName("车辆状态")] public ushort VehicleStatus { get; set; }

        //报警标识号在接口中声明

        public override ILocationAddition ReadEntity(ReadOnlySpan<byte> source, int startIndex)
        {
            DataLength = (byte)(source[startIndex + 1] + 2);

            var index = (int)(startIndex + 2);
            AlarmID = ParseHelper.Uint32(ref source, index);

            index += 4;
            AlarmStatus = source[index];

            index++;
            AlarmEvent = source[index];

            index++;
            AlarmLevel = source[index];

            index++;
            FrontVehicleSpeed = source[index];

            index++;
            FrontVehicleDistance = source[index];

            index++;
            DepartureType = source[index];

            index++;
            RoadLogoType = source[index];

            index++;
            RoadLogo = source[index];

            index++;
            Speed = source[index];

            index++;
            Elevation = ParseHelper.Uint16(ref source, index);

            index += 2;
            Latitude = Convert.ToDecimal(ParseHelper.Uint32(ref source, index) / Math.Pow(10, 6));

            index += 4;
            Longitude = Convert.ToDecimal(ParseHelper.Uint32(ref source, index) / Math.Pow(10, 6));

            index += 4;
            Time = ParseHelper.BcdTo1078Datetime(ref source, index);

            index += 6;
            VehicleStatus = ParseHelper.Uint16(ref source, index);

            index += 2;
            AlarmLogo.ReadEntity(source, ref index);

            return this;
        }
    }
}